home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / xprd / src / main.c < prev    next >
C/C++ Source or Header  |  1995-11-05  |  8KB  |  290 lines

  1. /*
  2.     XPR
  3.     ---
  4.     eXternal PRotocol Driver
  5.  
  6.     written & (C) 1990 by Oliver Wagne
  7.  
  8. */
  9.  
  10. #include <proto/dos.h>
  11. #include <proto/exec.h>
  12. #include <devices/serial.h>
  13. #include <string.h>
  14. #include <ctype.h>
  15. #include <time.h>
  16. #include <stdlib.h>
  17. #ifdef V030
  18. #include <exec/execbase.h>
  19. #endif
  20. #include "xpr.h"
  21.  
  22. extern void sprintf(char*,...);
  23.  
  24. short os13;
  25.  
  26. #define print(s) Write(Output(),s,strlen(s))
  27.  
  28. #define INFOSTRING "XPRD version V1.13; last compiled " __TIME__ " on " __DATE__ "\n\
  29. Written and copyright © 1991 by Oliver Wagner, All Rights Reserved\n\
  30. Contact:\n\x9b33;1m\
  31.     EMail : O.WAGNER@LINK-ESW.ZER (Z-Netz)\n\
  32.         O.WAGNER@LINK-ESW.ZER.SUB.ORG (Internet)\n\
  33.         Oliver Wagner of 2:240/5600 (Wauwaunet)\n\
  34.     Voice : (++49) (0)5659/518\n\
  35.     Data  :    (++49) (0)5659/1307 (24h DST) SUPPORT-BBS\n\
  36.         Snail : Oliver Wagner\n\
  37.                 Auf Dem Stein 5\n\
  38.                 3441 Weißenborn\n\
  39.         West Germoney\n\x9b0m"
  40.  
  41. extern char *xprfilearray[];
  42. struct Library *XProtocolBase,*IntuitionBase,*GfxBase;
  43.  
  44. char *libname="xprzmodem.library";
  45. char *options=0;
  46. char *devname="serial.device";
  47. short devnum=0;
  48. short nodelay=0;
  49. struct Screen *firstscreen=0;
  50. long rbuflen=0;
  51. short sharedaccess=0,rtscts=0;
  52. char *tempdir=0;
  53. long speed=0;
  54. short checkcarrier=0;
  55. short windowx=60,windowy=25;
  56. char *logfile=0;
  57. BPTR logfilep;
  58. char *errorfile=0;
  59. short nowindow=0;
  60.  
  61. void exit(int);
  62. int atoi(char*);
  63. void initdisplay(void);
  64. long xpr_chk4abort(void);
  65.  
  66. struct IOExtSer *xpr_serio;
  67. static struct IOExtSer ios;
  68. static struct MsgPort *smp;
  69.  
  70. static int openserial(char *dev,int unit)
  71. {
  72.     if(!(smp=CreatePort(0,0))) return(-1);
  73.     ios.IOSer.io_Message.mn_ReplyPort=smp;
  74.     if(sharedaccess) ios.io_SerFlags|=SERF_SHARED;
  75.     if(OpenDevice(dev,unit,&ios,0)) {
  76.     DeletePort(smp);
  77.     return(-1);
  78.     }
  79.     xpr_serio=&ios;
  80.     if(rbuflen||speed||rtscts) {
  81.     if(rbuflen) ios.io_RBufLen=rbuflen;
  82.     if(speed) ios.io_Baud=speed;
  83.     if(rtscts) ios.io_SerFlags|=SERF_7WIRE;
  84.     ios.IOSer.io_Command=SDCMD_SETPARAMS;
  85.     DoIO(&ios);
  86.     }
  87.     ios.IOSer.io_Command=SDCMD_QUERY;
  88.     DoIO(&ios);
  89.     speed=ios.io_Baud;
  90.     rtscts=ios.io_SerFlags&SERF_7WIRE;
  91.     return(0);
  92. }
  93. static void closeserial(void)
  94. {
  95.     CloseDevice(&ios);
  96.     DeletePort(smp);
  97. }
  98.  
  99. static char logbf[160];
  100. void __stdargs plog(char typ,char *string,long arg1,long arg2)
  101. {
  102.     long t;
  103.     if(logfilep) {
  104.         t=time(0);
  105.         sprintf(logbf,"%lc %24.24s : ",(long)typ,ctime(&t));
  106.         Write(logfilep,logbf,strlen(logbf));
  107.         sprintf(logbf,string,arg1,arg2);
  108.         Write(logfilep,logbf,strlen(logbf));
  109.     }
  110. }
  111.  
  112. int __stdargs closelog(int x)
  113. {
  114.     BPTR f;
  115.     plog('!',"Exiting XPRD\n");
  116.     if(logfilep) Close(logfilep);
  117.     sprintf(logbf,"%-2ld\n",x);
  118.     if(errorfile) {
  119.         if(f=Open(errorfile,MODE_NEWFILE)) {
  120.             Write(f,logbf,3);
  121.             Close(f);
  122.         }
  123.     }        
  124.     return(x);
  125. }
  126. void main(int argc, char**argv)
  127. {
  128.     int c=1,l=0,com,retval=20;
  129.     BPTR templock=0,oldlock=0;
  130.     char *help,ch1,ch2;
  131.  
  132.     onexit(closelog);
  133.     IntuitionBase=OpenLibrary("intuition.library",36);
  134.     if(!IntuitionBase) {
  135.         IntuitionBase=OldOpenLibrary("intuition.library");
  136.         os13=1;
  137.     }
  138.     GfxBase=OldOpenLibrary("graphics.library");
  139.     print("\x9b32;1m_____________________________________________________________________________\n\n\
  140.  \x9b0;33;3meXternal PRotocol Driver\x9b0m V1.13 by \x9b1mOliver Wagner\x9b0m © 1991, All Rights Reserved\n\
  141. \x9b32;1m_____________________________________________________________________________\n\n\x9b0m");
  142. #ifdef V030
  143.     {
  144.         struct ExecBase *eb=*((struct ExecBase**)4);
  145.         print("\t\t\t68020/30/40 \x9b33mONLY\x9b0m VERSION\n\n");
  146.         if(!(eb->AttnFlags&AFF_68020)) {
  147.         print("\x07");
  148.         exit(20);
  149.     }
  150.     }
  151. #endif
  152.     if(argc<2||*argv[1]=='?') {
  153.     print("Usage: XPRD [-options] s[end]|r[eceive] [file1 [file2 [file3...]]]\navaible options:\n\
  154. -l\x9b3mlibname \x9b0m   - define XPR library (def.: \"xprzmodem.library\")\n\
  155. -o\x9b3moptions \x9b0m   - define XPR startup options string\n\
  156. -d\x9b3mdevname \x9b0m   - define IO device (def.: \"serial.device\")\n\
  157. -u\x9b3munitnum \x9b0m   - define IO device unit (def.: 0)\n\
  158. -x\x9b3m[XS]speed \x9b0m - define IO device baud rate, RTS/CTS, SHARED\n\
  159. -t\x9b3mdirname \x9b0m   - define temporary dir for batch dl\n");
  160.     print("-b\x9b3mbufsize \x9b0m   - define IO device read buffer size (K)\n\
  161. -p\x9b3mx,y \x9b0m       - define window X and Y position\n\
  162. -m\x9b3mlogfile \x9b0m   - enable log option (def.: \"xprd.log\")\n\
  163. -r\x9b3merrfile \x9b0m   - define return code output file\n\
  164. -c         - enable carrier detect\n\
  165. -n         - no delay after EOT\n\
  166. -f         - open window on frontmost screen (DANGER!)\n\
  167. -q         - don't open window; quiet mode\n\
  168. -i         - display version and copyright information\n");
  169.  
  170.     exit(0);
  171.     }
  172.     while(*argv[c]=='-') {
  173.     switch(tolower(argv[c][1])) {
  174.         case 'l': libname=&argv[c][2]; break;
  175.         case 'o': options=&argv[c][2]; break;
  176.         case 'd': devname=&argv[c][2]; break;
  177.         case 'u': devnum=atoi(&argv[c][2]); break;
  178.         case 'b': rbuflen=atoi(&argv[c][2])<<10; break;
  179.         case 'x': if(strlen(argv[c])<3) break;
  180.               ch1=argv[c][2];
  181.               ch2=argv[c][3];
  182.               if(strlen(argv[c])>3) {
  183.                 if(ch1=='s'||ch2=='s') sharedaccess=1;
  184.                 if(ch1=='x'||ch2=='x') rtscts=1;
  185.                 if(ch2=='x'||ch2=='s') help=&argv[c][4];
  186.                 else if(ch1=='x'||ch1=='s') help=&argv[c][3];
  187.                 else help=&argv[c][2];
  188.               }
  189.               else {
  190.                 help=&argv[c][2];
  191.                 if(ch1=='s') {
  192.                     sharedaccess=1;
  193.                     help=&argv[c][3];
  194.                 }
  195.                 else if(ch1=='x') {
  196.                     rtscts=1;
  197.                     help=&argv[c][3];
  198.                 }
  199.               }
  200.               speed=atoi(help);
  201.               break;
  202.         case 'n': nodelay=1; break;
  203.         case 'p': help=&argv[c][2];
  204.               if(*help==',') {
  205.             windowy=atoi(&help[1]);
  206.             break;
  207.               }
  208.               windowx=atoi(help);
  209.               while(*help && *help!=',') help++;
  210.               if(*help==',') windowy=atoi(&help[1]);
  211.               break;
  212.            case 'f': firstscreen=(struct Screen*)-1; if(strlen(argv[c])==10) stch_l(&argv[c][2],&firstscreen);
  213.               if(!firstscreen) nowindow=1;
  214.               break;
  215.         case 's': sharedaccess=1; break;
  216.         case 't': tempdir=&argv[c][2]; break;
  217.         case 'c': checkcarrier=1; break;
  218.         case 'i': print(INFOSTRING); exit(0);
  219.         case 'm': if(strlen(argv[c])>2) logfile=&argv[c][2];
  220.               else logfile="XPRD.log";
  221.               if(!(logfilep=Open(logfile,MODE_OLDFILE))) {
  222.             if(!(logfilep=Open(logfile,MODE_NEWFILE))) {
  223.               print("Unable to open logfile!\x07\n");
  224.               exit(20);
  225.             }
  226.               }
  227.               else Seek(logfilep,0,OFFSET_END);
  228.               plog('!',"Started XPRD\n");
  229.               break;
  230.         case 'r': errorfile=&argv[c][2]; break;
  231.         case 'q': nowindow=1; break;
  232.         default: print("Illegal option: '");print(&argv[c][1]);
  233.              print("'!\x07\n"); exit(20);
  234.     }
  235.     c++;
  236.     if(c==argc) {
  237.         print("Missing SEND or RECEIVE!\n\x07");
  238.         exit(20);
  239.     }
  240.     }
  241.     if(tolower(*argv[c])!='s'&&tolower(*argv[c])!='r') {
  242.     print("Missing SEND or RECEIVE!\n\x07");
  243.     exit(20);
  244.     }
  245.     com=(tolower(*argv[c])=='s')?1:0;
  246.     c++;
  247.     if(c==argc) xprfilearray[l++]="NAPFSUELZE";
  248.     else while(c!=argc) xprfilearray[l++]=argv[c++];
  249.     xprfilearray[l]=0;
  250.  
  251.     if(!(XProtocolBase=OldOpenLibrary(libname))) {
  252.     print("Failed to open XPR library!\n\x07");
  253.     exit(20);
  254.     }
  255.     if(openserial(devname,devnum)) {
  256.     print("Failed to open IO device!\n\x07");
  257.     CloseLibrary(XProtocolBase);
  258.     exit(20);
  259.     }
  260.     if(xprinit(options)) {
  261.     print("Failed to init XPR library!\n\x07");
  262.     CloseLibrary(XProtocolBase);
  263.     closeserial();
  264.     exit(20);
  265.     }
  266.     if(tempdir) {
  267.     if(!(templock=Lock(tempdir,SHARED_LOCK))) {
  268.         print("Failed to Lock() tempory dir!\n\x07");
  269.         goto xit;
  270.     }
  271.     if(!(oldlock=CurrentDir(templock))) {
  272.         print("Can't CurrentDir() to temporary dir!\n\x07");
  273.         goto xit;
  274.     }
  275.     }
  276.     if(nowindow) print("Doing transfer in quiet mode\n");
  277.     initdisplay();
  278.     if(!xpr_chk4abort()) {
  279.     retval=(((com)?xprsend():xprreceive())==1)?0:20;
  280.     }
  281.     if(!nodelay) Delay(136);
  282. xit:
  283.     if(oldlock) CurrentDir(oldlock);
  284.     if(templock) UnLock(templock);
  285.     xprclose();
  286.     closeserial();
  287.     CloseLibrary(XProtocolBase);
  288.     exit(retval);
  289. }
  290.